/**
 * Created by IntelliJ IDEA.
 * User: Fatadeild Hagkaups
 * Date: 16.11.2011
 * Time: 23:37
 *
 * Þessi klasi sér um að framkvæma þau check sem þarf að framkvæma eftir hvert skipti sem leikmaður gerir.
 * Hann athugar hvort að það sé einhver búinn að vinna.
 * Hann athugar hvort að borðið sé orðið fullt.
 * Einnig er fall í honum sem sér um að update-a statistics um hversu oft hver player er búinn að vinna eða tapa.
 */
public class Check {

    /**
     * Fall sem athugar alla mögulega vinninga á borðinu.
     * @param board - borðið sem er verið að spila á.
     * @param input - það input sem við erum með.
     * @return - skilar true ef einhver er búinn að vinna, annars false.
     */
    public static boolean checkWin(Board board, Input input)
    {
        boolean hasWon = false;

        /*Athugar senario 1:
        [x][ ][ ]  [o][ ][ ]  [x][x][x]  [o][o][o]  [x][ ][ ]  [o][ ][ ]
        [x][ ][ ]  [o][ ][ ]  [ ][ ][ ]  [ ][ ][ ]  [ ][x][ ]  [ ][o][ ]
        [x][ ][ ]  [o][ ][ ]  [ ][ ][ ]  [ ][ ][ ]  [ ][ ][x]  [ ][ ][o]
        */
        if(board.isOccupied(0,0))
        {
            char mark = board.board[0][0];

            if((board.board[1][0] == mark && board.board[2][0] == mark) ||
                    (board.board[0][1] == mark && board.board[0][2] == mark) ||
                    (board.board[1][1] == mark && board.board[2][2] == mark))
            {
                updatePlayerResults(mark, input);
                hasWon = true;
            }
        }

        /*Athugar senario 2:
        [ ][x][ ]  [ ][o][ ]  [ ][ ][ ]  [ ][ ][ ]  [ ][ ][x]  [ ][ ][o]
        [ ][x][ ]  [ ][o][ ]  [x][x][x]  [o][o][o]  [ ][x][ ]  [ ][o][ ]
        [ ][x][ ]  [ ][o][ ]  [ ][ ][ ]  [ ][ ][ ]  [x][ ][ ]  [o][ ][ ]
        */

        if(board.isOccupied(1,1))
        {
            char mark = board.board[1][1];

            if((board.board[0][1] == mark && board.board[2][1] == mark) ||
                    (board.board[1][0] == mark && board.board[1][2] == mark) ||
                    (board.board[0][2] == mark && board.board[2][0] == mark))
            {
                updatePlayerResults(mark, input);
                hasWon = true;
            }
        }

        /*Athugar senario 3:
        [ ][ ][x]  [ ][ ][o]  [ ][ ][ ]  [ ][ ][ ]
        [ ][ ][x]  [ ][ ][o]  [ ][ ][ ]  [ ][ ][ ]
        [ ][ ][x]  [ ][ ][o]  [x][x][x]  [o][o][o]
        */
        if(board.isOccupied(2,2))
        {
            char mark = board.board[2][2];

            if((board.board[0][2] == mark && board.board[1][2] == mark) ||
                    (board.board[2][0] == mark && board.board[2][1] == mark))
            {
                updatePlayerResults(mark, input);
                hasWon = true;
            }
        }

        return hasWon;
    }

    /**
     * Fall sem sér um að update-a statistics hjá þeim leikmanni sem vann og hjá þeim leikmanni sem tapaði.
     * @param mark - Það merki sem við þurfum.
     * @param input
     */
    public static void updatePlayerResults(char mark, Input input)
    {
        if(input.player1.getMark() == mark)
        {
            input.setWinner(input.player1);
            input.player1.incrementWin();
            input.player2.incrementLoss();
        }
        else
        {
            input.setWinner(input.player2);
            input.player2.incrementWin();
            input.player1.incrementLoss();
        }
    }

    /**
     * Fall sem athugar hvort að borðið sé orðið fullt.
     * @param board - Borðið sem er verið að spila á.
     * @return - skilar true ef að borðið er fullt, annars false.
     */
    public static boolean checkBoardFull(Board board)
    {
        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                if(!(board.board[i][j] == 'X') && !(board.board[i][j] == 'O'))
                    return false;
            }
        }
        return true;
    }
}
